package com.gem.day14.homework;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

/**
 * 在制定目录下模糊搜索文件,*代表任意字符,?代表一个字符.比如搜索d:\\下  Test* 的文件
 */
public class Exercise1 {
	public static void main(String[] args) {
		findFilesByName("D:\\IO", "*.txt").forEach(System.out::println);
	}

	/**
	 * 模糊查询
	 * @param baseDirName		目标文件
	 * @param targetFileName	搜索的目标名字(模糊)
	 * @return
	 */
	public static List<String> findFilesByName(String baseDirName, String targetFileName) {
		//创建最终返回查询结果的集合
		List<String> list = new ArrayList<>();
		//构建File对象
		File file = new File(baseDirName);
		//判断
		if (file.exists()) {
			//获取File实例
			File[] listFiles = file.listFiles();
			//遍历
			String tempName = null;
			for (int i = 0; i < listFiles.length; i++) {
				//判断目录还是文件
				if (!listFiles[i].isDirectory()) {
					tempName = listFiles[i].getName();
					if (search(targetFileName, tempName)) {
						list.add(listFiles[i].getAbsolutePath());
					}
				}
			}
		}
		return list;
	}

	/**
	 * 匹配规则
	 * ? 匹配一个字符
	 * * 匹配任意字符
	 */
	private static boolean search(String pattern, String str) {
		//获取参数字符串的长度
		int pattenLength = pattern.length();
		int strLength = str.length();
		//定义变量保存字符
		char eachChar;
		int strIndex = 0;
		for (int i = 0; i < pattenLength; i++) {
			eachChar = pattern.charAt(i);
			if (eachChar == '*') {
				while (strIndex < strLength) {
					if (search(pattern.substring(i + 1), str.substring(strIndex))) {
						return true;
					}
					strIndex++;
				}
			} else if (eachChar == '?') {
				strIndex++;
				if (strIndex > strLength) {
					return false;
				}
			} else {
				if (strIndex >= strLength || eachChar != str.charAt(strIndex)) {
					return false;
				}
				strIndex++;
			}
		}
		return (strIndex == strLength);
	}
}
